package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import co.gov.medellin.ssti.sub.model.dao.RestriccionDAO;
import co.gov.medellin.ssti.sub.model.vo.RestriccionVO;

public class RestriccionDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		RestriccionDAO {

	@SuppressWarnings("deprecation")
	public String[] validarRestriccion(String CodigoAtri, String CodRest,
			String Valor, String TipoDato) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		// int iCodAtri = Integer.parseInt(CodigoAtri.trim());
		int iCodRest = Integer.parseInt(CodRest.trim());
		String retorno[] = new String[3];

		String query = "SELECT OPERADOR,OPERANDO1,OPERANDO2,ALERTA,VIGENCIA,CAMPO_A4 "
				+ " FROM TCS_BEN_RESTRICCION WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", iCodRest);
		System.out.println("query: " + query);
		System.out.println("codigo: " + iCodRest);

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(query, namedParameters);
		for (Map<String, Object> row : rows) {

			String strOperador = (String) row.get("OPERADOR");
			String strOperando1 = (String) row.get("OPERANDO1");
			String strOperando2 = (String) row.get("OPERANDO2");
			String strAlerta = (String) row.get("ALERTA");
			String strVigencia = (String) row.get("VIGENCIA");
			String strCampoA4 = (String) row.get("CAMPO_A4");
			if ((Object) strCampoA4 == null) {
				strCampoA4 = "";
			}
			if (strAlerta.equals("S")) {
				retorno[0] = "S";
			} else {
				retorno[0] = "N";
			}
			if (strVigencia.equals("A")) {
				int iOperador = Integer.parseInt(strOperador.trim());

				switch (iOperador) {
				case 1:
					if (!TipoDato.equals("F")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor > iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Mayor a " + strOperando1;
							} else {
								retorno[2] = "Mayor a " + strCampoA4;
							}
						}
					} else {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) < 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Mayor a " + strOperando1;
							} else {
								retorno[2] = "Mayor a " + strCampoA4;
							}
						}
					}
					break;

				case 2:
					if (!TipoDato.equals("F")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor < iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Menor a " + strOperando1;
							} else {
								retorno[2] = "Menor a " + strCampoA4;
							}
						}
					} else {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) < 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Menor a " + strOperando1;
							} else {
								retorno[2] = "Menor a " + strCampoA4;
							}
						}
					}
					break;
				case 3:
					if (TipoDato.equals("N")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor == iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Igual a " + strOperando1;
							} else {
								retorno[2] = "Igual a " + strCampoA4;
							}
						}
					} else if (TipoDato.equals("F")) {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) == 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Igual a " + strOperando1;
							} else {
								retorno[2] = "Igual a " + strCampoA4;
							}
						}
					} else {
						if (Valor.equals(strOperando1)) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Igual a " + strOperando1;
							} else {
								retorno[2] = "Igual a " + strCampoA4;
							}
						}
					}
					break;

				case 4:
					if (!TipoDato.equals("F")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor >= iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Mayor o Igual a " + strOperando1;
							} else {
								retorno[2] = "Mayor o Igual a" + strCampoA4;
							}
						}
					} else {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) >= 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Mayor o Igual a " + strOperando1;
							} else {
								retorno[2] = "Mayor o Igual a" + strCampoA4;
							}
						}
					}
					break;
				case 5:
					if (!TipoDato.equals("F")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor <= iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Menor o Igual a " + strOperando1;
							} else {
								retorno[2] = "Menor o Igual a" + strCampoA4;
							}
						}
					} else {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) <= 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Menor o Igual a " + strOperando1;
							} else {
								retorno[2] = "Menor o Igual a" + strCampoA4;
							}
						}
					}
					break;

				case 6:
					if (TipoDato.equals("N")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						if (iValor != iOperando1) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Diferente a " + strOperando1;
							} else {
								retorno[2] = "Diferente a" + strCampoA4;
							}
						}
					} else if (TipoDato.equals("F")) {
						Date date1 = new Date(Valor);
						Date date2 = new Date(strOperando1);

						if (date1.compareTo(date2) != 0) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if (strCampoA4.equals("")) {
								retorno[2] = "Diferente a " + strOperando1;
							} else {
								retorno[2] = "Diferente a" + strCampoA4;
							}
						}
					} else {
						if (!Valor.equals(strOperando1)) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							if ((Object) strCampoA4 == null) {
								retorno[2] = "Diferente a " + strOperando1;
							} else {
								retorno[2] = "Diferente a" + strCampoA4;
							}
						}
					}
					break;

				case 7:
					if (TipoDato.equals("N")) {
						int iValor = Integer.parseInt(Valor.trim());
						int iOperando1 = Integer.parseInt(strOperando1.trim());
						int iOperando2 = Integer.parseInt(strOperando2.trim());
						if (iValor >= iOperando1 && iValor <= iOperando2) {
							retorno[1] = "true";
						} else {
							retorno[1] = "false";
							retorno[2] = "Entre " + strOperando1 + " y "
									+ strOperando2;
						}
					} else {
						if (TipoDato.equals("F")) {
							Date date1 = new Date(Valor);
							Date date2 = new Date(strOperando1);

							if (date1.compareTo(date2) <= 0) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								retorno[2] = "Entre " + strOperando1 + " y "
										+ strOperando2;
							}
						}
					}
					break;
				}
			} else {
				retorno[1] = "true";
			}
		}
		return retorno;
	}

	public RestriccionVO findRestriccion(String CodRest) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iCodRest = Integer.parseInt(CodRest.trim());

		String query = "SELECT CODIGO,DESCRIPCION,OPERADOR,OPERANDO1,OPERANDO2,ALERTA,VIGENCIA "
				+ "FROM TCS_BEN_RESTRICCION WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", iCodRest);

		System.out.println("[" + this.getClass() + ":findRestriccion]: query:"
				+ query);
		System.out.println("codigo: " + iCodRest);
		RestriccionVO restriccionVO = new RestriccionVO();

		try {
			restriccionVO = getNamedParameterJdbcTemplate().queryForObject(
					query, namedParameters, new RowMapper<RestriccionVO>() {

						public RestriccionVO mapRow(ResultSet rst, int rowNum)
								throws SQLException {
							RestriccionVO vo = new RestriccionVO();
							vo.setCodigo(rst.getString("CODIGO"));
							vo.setDescripcion(rst.getString("DESCRIPCION"));
							vo.setOperador(rst.getString("OPERADOR"));
							vo.setOperando1(rst.getString("OPERANDO1"));
							vo.setOperando2(rst.getString("OPERANDO2"));
							vo.setAlerta(rst.getString("ALERTA"));
							vo.setVigencia(rst.getString("VIGENCIA"));
							return vo;
						}
					});
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return restriccionVO;
	}

	public int modificarRestriccion(String strCodRest, String[] Arr) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iCodRestric = Integer.parseInt(strCodRest.trim());

		String query = "UPDATE TCS_BEN_RESTRICCION SET "
				+ " DESCRIPCION = UPPER(:DESCRIPCION), OPERADOR = :OPERADOR, "
				+ " OPERANDO1 = UPPER(:OPERANDO1), OPERANDO2 = UPPER(:OPERANDO2), "
				+ " ALERTA = :ALERTA, VIGENCIA = :VIGENCIA, CAMPO_A4 = :CAMPO_A4 "
				+ " WHERE CODIGO = :CODIGO ";

		namedParameters.put("DESCRIPCION", Arr[0]);
		namedParameters.put("OPERADOR", Arr[1]);
		namedParameters.put("OPERANDO1", Arr[2]);
		namedParameters.put("OPERANDO2", Arr[3]);
		namedParameters.put("ALERTA", Arr[4]);
		namedParameters.put("VIGENCIA", Arr[5]);
		namedParameters.put("CAMPO_A4", Arr[6]);
		namedParameters.put("CODIGO", iCodRestric);

		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

}
